home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / lisp / glisp / glisp.000 / GLISP.UNIX.TAR / closunix / clos.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-04-03  |  24.9 KB  |  801 lines

  1. /*                 GRAPHIC LISP            */
  2. /*        Scritto nel 1991-94 da Zoia Andrea Michele     */
  3. /*        Via Pergola #1 Tirano (SO) Tel. 0342-704210    */
  4. /* File clos.h */
  5.  
  6. #ifdef CLOS_TC
  7. #include "clostc.h"
  8. #endif
  9. #ifdef CLOS_WI
  10. #include "closwin.h"
  11. #endif
  12. #ifdef CLOS_XE
  13. #include "closxen.h"
  14. #endif
  15. #ifdef CLOS_UX
  16. #include "closunix.h"
  17. #endif
  18. #ifdef  CLOS_BL
  19. #include "bliswin.h"
  20. #endif
  21.  
  22. #ifndef CONFIGFILE
  23. #error Devi compilare definendo CLOS_TC o CLOS_WI o CLOS_XE o CLOS_UX o CLOS_BL
  24. #endif
  25.  
  26.  
  27. #include "closerr.h"
  28. #include "closnans.h"
  29.  
  30. #define CLOS_H_INCLUDED
  31. #define NO_LISPMEM_DEBUG /* definendo LISPMEM_DEBUG si stampano delle informazioni utili al debug */
  32. #define YYDEBUG 0        /* defindendo YYDEBUG 1 si fa genereare a YACC un codice + lungo ma utile per il debug del parser */
  33. #define REGISTER_MOD        register  /* keyword register */
  34.  
  35. #define CLOS_VERSION         "2.7.6"
  36. #define STANDARD_PROMPT        ">"
  37. #define INPUT_PROMPT        "*"
  38. #define NIL_IDENTIFIER        "NIL"
  39. #define TRUE_IDENTIFIER        "T"
  40. #define FILE_ERROR_ID        "*FILE_ERROR*"
  41. #define PARSE_ERROR_ID        "*SYNTAX_ERROR*"
  42. #define WINDOWS_ID        "*WINDOWS*"
  43. #define UNBOUND_ID        "*UNBOUND*"
  44. #define MAX_ID_LENGHT       130     /* lunghezza massima di un identificatore */
  45.                     /* senza lo zero finale */
  46.  
  47.  
  48. #define MAX_STR_LENGHT (MAX_ID_LENGHT-2)      /* o di una stringa(-2) */
  49.                           /* perche' in yytext entrano */
  50.                           /* anche gli apici */
  51.  
  52. #ifdef YYLMAX                   /* quando si compila CLOSLEX lo si */
  53. #undef  YYLMAX                 /* in modo da definire la lunghezza */
  54. #define YYLMAX (MAX_ID_LENGHT+1)       /* massima di un identificatore */
  55. #endif                    /* con lo 0 finale */
  56.  
  57.  
  58.  
  59. #define EVAL_NORM       0       /* valutazione normale               */
  60. #define EVAL_SETF       1       /* non da unbound error ma cerca gli */
  61.                 /* eventuali legami locali del nodo  */
  62. #define DUP_LASTDUP    0    /* flags per list-dup */
  63. #define DUP_LASTNIL    1
  64.  
  65. #define DELETED         ((node)0xfffffffeL) /* indica l'hash entry cancellata */
  66.  
  67. #define NIL        nilhandler    /* nodo NIL  sempre allocato */
  68. #define T        truehandler    /* nodo T    sempre allocato */
  69. #define VOID        voidhandler    /* nodo VOID sempre allocato */
  70. /* e' usato per segnalare errore dalle funzioni che ritornano un nodo */
  71. /* ed รจ usato per tenere il primo nodo della lista dei nodi */
  72.  
  73. #define TRUE        1
  74. #define FALSE        0
  75. #define    OK        0    /* usato dalle funzioni che ritornano un int */
  76. #define ERROR        1    /* usato dalle funzioni che ritornano un int */
  77.  
  78.  
  79.  
  80. #define LF_PARAMSD ()
  81. #define LF_PARAMS (nin,nout,genv,lenv,fl)\
  82.         node nin;node_p*nout;node genv;node lenv;unsigned fl;
  83.  
  84. #ifdef LOGISCOPE    /* se si vuole usare il LOGISCOPE (su HP9000).... */
  85. #define node_s struct node_str
  86. #define node_p struct lf_dialog_type
  87. typedef unsigned long int node;
  88. #define lsiz_t unsigned long int
  89. #define len_t  unsigned int
  90. #define    hash_t unsigned long int
  91. #define str_t  unsigned long int
  92. #define n_int  long int
  93. #define n_real double
  94. #define n_type unsigned int
  95. #define p_type unsigned int
  96. #define n_func void*
  97. #define n_char char
  98. #else
  99. typedef struct node_str        node_s; /* struttura di un nodo-lisp */
  100. typedef struct lf_dialog_type    node_p;    /* struttura di un puntatore ad un nodo-lisp */
  101. typedef unsigned long int    node;   /* tipo di dato di un nodo-lisp */
  102. typedef unsigned long int    lsiz_t;    /* ampiezza aree di memoria e numero di nodo allocati allo start-up */
  103. typedef unsigned int         len_t;    /* lunghezza liste */
  104. typedef    unsigned long int    hash_t;    /* hash type */
  105. typedef unsigned long int    str_t;    /* lisp string type */
  106. typedef long int        n_int;  /* lisp integer type */
  107. typedef double            n_real; /* lisp real type */
  108. typedef unsigned int        n_type;    /* tipo del valore di un nodo-lisp */
  109. typedef unsigned int        p_type;    /* tipo di un puntatore ad un nodo */
  110. typedef void                    (*n_func)LF_PARAMSD; /* funzione lisp */
  111. typedef char            n_char;
  112. #endif
  113.  
  114. #define P(x)    ((node_s*)(x)) /* ritorna il puntatore (node_s*) associato all'handler x(node) */
  115. #define Q(x)    ((node)(x))    /* ritorna l'handler (node) associato al puntatore x(node_s*) */
  116.  
  117.  
  118. struct node_str{
  119. /* 2 */    n_type    type;    /* tipo del nodo (vedi sotto) */
  120. /* 4 */    node    next;    /* prossimo nodo nella lista */
  121. /* 4 */    node    nextlock; /* prossimo nodo bloccato */
  122. /*---*/ union{
  123. /* 10 */
  124.         struct{                 /* nodo con nome */
  125. /* 4 */            str_t    name;   /* nome */
  126. /* 4 */            hash_t    hash;    /* hash del nome */
  127. /* 4 */            node    value;    /* valore globale */
  128. /* 4 */            node    plist;    /* property-list */
  129. /* 4 */            node    func;    /* legame funzionale */
  130. /* 4 */                 node    class;  /* legame classe */
  131. /*---*/        }nname;
  132. /*24 */
  133. /*===*/
  134. /*34 */
  135.         struct{                   /* nodo cons */
  136.             node    left;    /* car */
  137.             node    right;    /* cdr */
  138.         }ncons;
  139.  
  140.         union{                  /* nodo valore */
  141.             n_real    real;      /* nodo real */
  142.             n_int    integer;/* nodo integer */
  143.             str_t    string;    /* nodo string */
  144.             n_func    sysfunc;/* nodo funzione di sistema */
  145.             n_char  character; /* carattere */
  146.             FILE    *stream;/* stream */
  147.             node    node;   /* nodo accessorio */
  148.                 /* (: , & , method o istanza di classe ) */
  149.  
  150.             struct{
  151.                 n_int   num;
  152.                 n_int   den;
  153.             }ratio;
  154.  
  155.             struct{
  156.                 n_real    real;
  157.                 n_real    img;
  158.             }complex;
  159.  
  160.  
  161.             struct{
  162. /* 4 */                         node    params_type;
  163. /* 4 */                         node    params;
  164. /* 4 */                         node    optionals;
  165. /* 4 */                         node    rest;
  166. /* 4 */                         node    key;
  167. /* 4 */                         node    aux;
  168. /* 4 */                         node    sexprs;
  169. /* 4 */                         node    environment;
  170. /*---*/                 }userfunc;
  171. /*32 */
  172. /*===*/
  173. /*42 */
  174.             struct{
  175.                                 node    name;
  176.                 lsiz_t  field;
  177.                         }accessor;
  178.         }nvalue;
  179.     }body;
  180. };
  181.  
  182.  
  183.  
  184. /******************* NODE TYPE *********************************
  185.  
  186.  node type    16 bit
  187.  il primo byte ha significati differenti a seconda del tipo del nodo
  188.  il secondo byte e' uguale per tutti i tipi di nodo
  189.  
  190.  
  191.     0    1    2    3    4    5    6    7
  192. nname:  --------------name binds flags----------------
  193.     name    value   plist   bind    func    class  xxx     xxx
  194.      *      *       *    defvar     *      NA
  195. nvalue: --------value-type--------------------------- -value flags-
  196.     ---ordinal type----------    numberp has-node xxxx istraced
  197. 0       0000 nodo appena allocato       0         0     0       0
  198. 1       1000 integer                    1         0     0       0
  199. 2       0100 real                       1         0     0       0
  200. 3       1100 string                     0         0     0       0
  201. 4       0010 ratio                      1         0     0       0
  202. 5       1010 sysfunc                    0         0     0       ?
  203. 6       0110 ufunc                      0         0     0       ?
  204. 7       1110 accessor                   0         0     0       ?
  205. 8       0001 method                     0         1     0       ?
  206. 9       1001 class                      0         1     0       0
  207. 10 a    0101 char  (non implementato)   0         0     0       0 NI
  208. 11 b    1101 &-node                     0         1     0       0
  209. 12 c    0011 :-node                     0         1     0       0
  210. 13 d    1011 complex (non impl.)        1         0     0       0 NI
  211. 14 e    0111 stream                     0         0     0       0
  212. 15 f    1111 macro                      0         0     0       ?
  213.  
  214. ncons: --------------------------non utilizzati--------------------
  215.     xxx     xxx     xxx     xxx     xxx     xxx     xxx     xxx
  216.  
  217.  
  218.  
  219.  
  220. 8    9    10    11    12    13    14    15
  221. -------type of cell-------      islock isrem  isfix  ismarked
  222. 0000 new-cell                    0       0      0       0
  223. 1000 name                        ?       ?      ?       ?
  224. 0100 value                       ?       ?      ?       ?
  225. 0010 cons                        ?       ?      ?       ?
  226. 0001 xxxxxxxx                    x       x      x       x
  227.  
  228. ************************************************************************/
  229.  
  230.  
  231. /* queste sono tutte le define corrispondenti al tipo-nodo */
  232.  
  233. #define NT_NEW_NODE_T           0x0000 /* nodo appena allocato */
  234.  
  235. /*===================================LOW  BYTE===========================*/
  236. /* low-byte solo nodo con nome */
  237. #define NT_HAS_NOTHING          0x0000
  238. #define NT_HAS_NAME             0x0001
  239. #define NT_HAS_VALUE            0x0002
  240. #define NT_HAS_PLIST            0x0004
  241. #define NT_HAS_BIND             0x0008
  242. #define NT_HAS_FUNCTION         0x0010
  243. #define NT_HAS_CLASS            0x0020
  244.  
  245. /* low-byte solo nodo valore */
  246. #define NT_IS_NUMBER            0x0010
  247.  
  248. #define NT_IS_NODEBIND          0x0020
  249.  
  250. #define NT_IS_TRACE             0x0080
  251. #define NT_UNTRACE              0xff7f
  252.  
  253. #define NT_INTEGER             (0x0001 + NT_IS_NUMBER)
  254. #define NT_REAL                (0x0002 + NT_IS_NUMBER)
  255. #define NT_STRING               0x0003
  256. #define NT_RATIO               (0x0004 + NT_IS_NUMBER)
  257. #define NT_SYSFUNC              0x0005
  258. #define NT_UFUNC                0x0006
  259. #define NT_ACCESSOR             0x0007
  260. #define NT_METHOD              (0x0008 + NT_IS_NODEBIND)
  261. #define NT_CLASS               (0x0009 + NT_IS_NODEBIND)
  262. #define NT_CHAR                 0x000a
  263. #define NT_ENAME               (0x000b + NT_IS_NODEBIND)
  264. #define NT_CNAME               (0x000c + NT_IS_NODEBIND)
  265. #define NT_COMPLEX             (0x000d + NT_IS_NUMBER)
  266. #define NT_STREAM               0x000e
  267. #define NT_MACRO        0x000f
  268. #define NT_MASK                 0x003f
  269. /*=======================================================================*/
  270.  
  271.  
  272. /*===================================HIGH BYTE===========================*/
  273. /* high-byte per tutti i nodi */
  274. #define NT_IS_NEW               0x0000
  275. #define NT_IS_NAME              0x0100
  276. #define NT_IS_VALUE             0x0200
  277. #define NT_IS_CONS              0x0400
  278. #define NT_IS_MASK              0x0f00
  279.  
  280. #define    NT_IS_MARK        0x8000    /* marcatura del GC */
  281. #define    NT_UNMARK        0x7fff
  282.  
  283. #define NT_IS_FIX               0x4000
  284. #define NT_UNFIX                0xbfff
  285.  
  286. #define NT_IS_REM               0x2000
  287. #define NT_UNREM                0xdfff
  288.  
  289. #define NT_IS_LOCK        0x1000
  290. #define NT_UNLOCK        0xefff
  291. /*=======================================================================*/
  292.  
  293.  
  294. /*============================== TYPE MACRO =============================*/
  295. /* macro per vedere di che tipo e' un nodo */
  296. /* tutti i nodi */
  297. #define IS_NAME(n)        ( P((n))->type & NT_IS_NAME  )
  298. #define IS_VALUE(n)        ( P((n))->type & NT_IS_VALUE )
  299. #define IS_CONS(n)        ( P((n))->type & NT_IS_CONS  )
  300. #define IS_VALUE_AND_NUMBER(n)\
  301. ( (P((n))->type & (NT_IS_VALUE+NT_IS_NUMBER))==(NT_IS_VALUE+NT_IS_NUMBER) )
  302.  
  303. #define GET_NTYPE(n)            ( P((n))->type & NT_IS_MASK  )
  304.  
  305. #define MARK(n)            ( P((n))->type|=NT_IS_MARK   )
  306. #define UNMARK(n)        ( P((n))->type&=NT_UNMARK    )
  307. #define IS_MARK(n)        ( P((n))->type & NT_IS_MARK  )
  308.  
  309. #define FIX(n)                  ( P((n))->type|=NT_IS_FIX    )
  310. #define UNFIX(n)                ( P((n))->type&=NT_UNFIX     )
  311. #define IS_FIX(n)               ( P((n))->type & NT_IS_FIX   )
  312.  
  313. #define REM(n)                  ( P((n))->type|=NT_IS_REM    )
  314. #define UNREM(n)                ( P((n))->type&=NT_UNREM     )
  315. #define IS_REM(n)               ( P((n))->type & NT_IS_REM   )
  316.  
  317. #define LOCK(n)                  ( P((n))->type|=NT_IS_LOCK   )
  318. #define UNLOCK(n)                ( P((n))->type&=NT_UNLOCK    )
  319. #define IS_LOCK(n)               ( P((n))->type & NT_IS_LOCK  )
  320.  
  321. /* solo nodi con nome */
  322. #define HAS_NAME(n)             ( P((n))->type & NT_HAS_NAME )
  323. #define HAS_VALUE(n)            ( P((n))->type & NT_HAS_VALUE )
  324. #define HAS_PLIST(n)            ( P((n))->type & NT_HAS_PLIST )
  325. #define HAS_BIND(n)             ( P((n))->type & NT_HAS_BIND )
  326. #define HAS_FUNCTION(n)         ( P((n))->type & NT_HAS_FUNCTION )
  327. #define HAS_CLASS(n)            ( P((n))->type & NT_HAS_CLASS )
  328. #define HAS_SOMETHING(n)        ( P((n))->type & (NT_HAS_VALUE+NT_HAS_PLIST+NT_HAS_BIND+NT_HAS_FUNCTION+NT_HAS_CLASS))
  329.  
  330. /* solo nodi valore */
  331. #define TRACE(n)                ( P((n))->type|=NT_IS_TRACE  )
  332. #define UNTRACE(n)              ( P((n))->type&=NT_UNTRACE   )
  333. #define IS_TRACE(n)             ( P((n))->type & NT_IS_TRACE )
  334.  
  335. #define GET_VTYPE(n)            ( P((n))->type & NT_MASK     )
  336.  
  337. #define IS_NODEBIND(n)          ( P((n))->type & NT_IS_NODEBIND )
  338.  
  339. #define IS_NUMBER(n)            ( P((n))->type & NT_IS_NUMBER )
  340. /*=======================================================================*/
  341.  
  342.  
  343. /*======================= FIELD MACRO ===================================*/
  344. /* macro per accedere ai campi di un nodo */
  345. /* tutti i nodi */
  346. #define TYPE(n)            ( P((n))->type )
  347. #define NEXT(n)            ( P((n))->next )
  348. #define NEXTLOCK(n)        ( P((n))->nextlock)
  349.  
  350. /*nodo con nome */
  351. #define NAME(n)                 ( P((n))->body.nname.name )
  352. #define HASH(n)                 ( P((n))->body.nname.hash )
  353. #define VALUE(n)                ( P((n))->body.nname.value )
  354. #define FUNCTION(n)             ( P((n))->body.nname.func )
  355. #define PLIST(n)                ( P((n))->body.nname.plist )
  356. #define CLASS(n)                ( P((n))->body.nname.class )
  357.  
  358. /* nodo cons */
  359. #define CONSLEFT(n)             ( P((n))->body.ncons.left )
  360. #define CONSRIGHT(n)            ( P((n))->body.ncons.right )
  361.  
  362. /* nodo valore */
  363. #define REAL(n)                 ( P((n))->body.nvalue.real )
  364. #define INTEGER(n)              ( P((n))->body.nvalue.integer )
  365. #define RATIO_NUM(n)            ( P((n))->body.nvalue.ratio.num )
  366. #define RATIO_DEN(n)            ( P((n))->body.nvalue.ratio.den )
  367. #define STRING(n)               ( P((n))->body.nvalue.string )
  368. #define SYSFUNC(n)              ( P((n))->body.nvalue.sysfunc )
  369. #define UFUNC_TYPE(n)           ( P((n))->body.nvalue.userfunc.params_type )
  370. #define UFUNC_PAR(n)            ( P((n))->body.nvalue.userfunc.params )
  371. #define UFUNC_SEX(n)            ( P((n))->body.nvalue.userfunc.sexprs )
  372. #define UFUNC_ENV(n)            ( P((n))->body.nvalue.userfunc.environment )
  373. #define UFUNC_OPT(n)            ( P((n))->body.nvalue.userfunc.optionals )
  374. #define UFUNC_REST(n)           ( P((n))->body.nvalue.userfunc.rest )
  375. #define UFUNC_KEY(n)            ( P((n))->body.nvalue.userfunc.key )
  376. #define UFUNC_AUX(n)            ( P((n))->body.nvalue.userfunc.aux )
  377. #define ENAME(n)                ( P((n))->body.nvalue.node )
  378. #define CNAME(n)                ( P((n))->body.nvalue.node )
  379. #define NODE(n)                 ( P((n))->body.nvalue.node )
  380. #define METHOD(n)               ( P((n))->body.nvalue.node )
  381. #define CLASS_INSTANCE(n)     ( P((n))->body.nvalue.node )
  382. #define ACCESSOR_NAME(n)        ( P((n))->body.nvalue.accessor.name )
  383. #define ACCESSOR_FIELD(n)       ( P((n))->body.nvalue.accessor.field )
  384. #define CHARACTER(n)            ( P((n))->body.nvalue.character )
  385. #define STREAM(n)               ( P((n))->body.nvalue.stream )
  386. #define COMPLEX_REAL(n)         ( P((n))->body.nvalue.complex.real )
  387. #define COMPLEX_IMG(n)          ( P((n))->body.nvalue.complex.img )
  388. /*=======================================================================*/
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396. struct    lf_dialog_type{        /* struttura di un puntatore ad un nodo  */
  397.     node    node;        /* il puntatore serve ad.es. se si fa     */
  398.     p_type    type;        /* un (setf (cdr l) 'atom) si capisce     */
  399. };                /* che e' necessario che cdr ritorni non */
  400.                 /* il nodo a destra di l ma tutto il cons */
  401.                 /* con il puntatore sul suo elemento a destra */
  402.  
  403. /* p-type ha 16 bit e indica a quale campo del nodo sta' puntando*/
  404. /*      15      14      13      12      11      10      9       8       */
  405.  
  406.  
  407. /*     7    6    5    4    3    2    1    0     */
  408. /*            cons   unb-name  name    --------ordinal type------    */
  409.  
  410.  
  411. #define P_ALLNODE        0x01    /* tutto il nodo */
  412.  
  413. #define P_VALUE            0x10     /* puntano ai campi di un nodo nome */
  414. #define P_PLIST            0x11
  415. #define P_FUNC                  0x12
  416. #define P_CLASS                 0x13
  417.  
  418. #define P_UNBOUNDFUNC        0x30
  419. #define P_UNBOUNDVALUE        0x31
  420. #define P_UNBOUNDPLIST          0x32
  421. #define P_UNBOUNDCLASS          0x33
  422.  
  423. #define P_CONSLEFT              0x40    /* puntano ai campi di un nodo cons */
  424. #define P_CONSRIGHT             0x41
  425.  
  426.  
  427.  
  428. struct config_s{            /* info di configurazione */
  429.     unsigned long    nodes;
  430.     unsigned long    strings;
  431.     unsigned long    hashes;
  432.     unsigned    bad_char_error;
  433.     unsigned    max_id_lenght;
  434.     unsigned    max_string_lenght;
  435.     unsigned    case_sensitive;
  436.     unsigned    gcbeep;
  437. };
  438.  
  439.  
  440. /************VARIABILI GLOBALI ISTANZIATE IN CLOSMAIN.C *********************/
  441.  
  442. extern struct config_s    config;        /* CLOS configuration */
  443. extern node    nilhandler;        /* nodo NIL */
  444. extern node    truehandler;            /* nodo T */
  445. extern node    voidhandler;        /* nodo VOID */
  446. extern FILE    *dribble_file;        /* capture-session file */
  447. extern char    buf1[];            /* 3 scratch-pads */
  448. extern char    buf2[];            /* di dimensione */
  449. extern char    buf3[];            /* MAX_ID_LENGHT+1 */
  450. extern jmp_buf  critical_jmp;        /* errori critici */
  451. extern jmp_buf  break_jmp;        /* break-level */
  452.  
  453.  
  454. /******************************** PROTOTIPI DELLE FUNZIONI *****************/
  455.  
  456. /* lispmain.c */
  457. void    lisp_free();
  458. void    lisp_main_loop();
  459. node    eval_lisp_file();
  460. int    skip_spaces_tabs_nwl();
  461.  
  462. /* closnode.c */
  463. node    node_make_();
  464. node    node_alloc();
  465. node    node_scan();
  466. int    node_malloc();
  467. void    node_free();
  468. node    node_getlastlock_();
  469. void    node_signal();
  470. void    node_gc();
  471. node    node_lockreset();
  472. void    node_count();
  473. void    node_criticalgc();
  474. node    node_scan_fix();
  475.  
  476. #ifdef __NOINLINE__
  477.  node    node_make();
  478.  node    node_lock();
  479.  node    node_getlastlock();
  480. #else
  481.  extern node lastalloc_node;
  482.  extern node lastlock_node;
  483.  
  484. #define node_make()                            \
  485. (                                    \
  486.   P(NEXT(lastalloc_node))                        \
  487.   ?(                                    \
  488.     lastalloc_node=NEXT(lastalloc_node),                \
  489.     LOCK(lastalloc_node),                                               \
  490.     NEXTLOCK(lastlock_node)=lastalloc_node,                             \
  491.     lastlock_node=lastalloc_node                                        \
  492.   )                                                                     \
  493.   :(                                                                    \
  494.     node_gc(),                                \
  495.     P(NEXT(lastalloc_node))                        \
  496.     ?(                                        \
  497.       lastalloc_node=NEXT(lastalloc_node),                \
  498.       LOCK(lastalloc_node),                                             \
  499.       NEXTLOCK(lastlock_node)=lastalloc_node,                           \
  500.       lastlock_node=lastalloc_node                                      \
  501.     )                                                                   \
  502.     :(                                                                  \
  503.       error(E_NOMEMNODES,ERR_MERROR|ERR_PVOID|ERR_TCRIT,NULL)        \
  504.     )                                                                   \
  505.   )                                                                     \
  506.  )
  507.  
  508. #define node_lock(n)                            \
  509.  (                                                                      \
  510.   FIX(n),                                                               \
  511.   IS_LOCK(n)                                                            \
  512.   ?(                                                                    \
  513.     n                                                                   \
  514.   ):                                                                    \
  515.   (                                                                     \
  516.    LOCK(n),                                                             \
  517.    NEXTLOCK(lastlock_node)=n,                                           \
  518.    lastlock_node=n                                                      \
  519.   )                                                                     \
  520.  )
  521.  
  522. #define node_getlastlock() lastlock_node
  523. #endif
  524.  
  525.  
  526. /* closstri.c */
  527. char    *string_get();
  528. char    *string_getconv();
  529. str_t    string_put();
  530. int    string_isallocable();
  531. int    string_del();
  532. int    string_gc();
  533. int    string_malloc();
  534. int    string_free();
  535.  
  536. /* closhash.c */
  537. node    hash_search();
  538. void    hash_put();
  539. void    hash_del();
  540. int    hash_malloc();
  541. void    hash_free();
  542. void    hash_stat();
  543.  
  544. /* closacc.c */
  545. len_t   listlen_func();
  546. node    list_dup();
  547. node    calc_pointer();
  548. int     find_in_alist();
  549. node    put_in_alist();
  550. int     chk_alist();
  551. node    list_elt();
  552. void     internal_setf();
  553. void     internal_update_environment();
  554.  
  555. /* clos_lfl.c */
  556. void    lambda_eval();
  557. void    macro_eval();
  558.  
  559. /* clos_clm.c */
  560. void    method_eval();
  561. void    accessor_eval();
  562.  
  563. /* closfunc.c */
  564. node     fprint_func();
  565. void    eval LF_PARAMSD;
  566. node    eval_list();
  567. node    eval_list_lc();
  568. void    apply_func();
  569.  
  570. /* closyacc.c */
  571. node    input_func();
  572.  
  573. /********************* PROTOTIPI DELLE FUNZIONI LISP ********************/
  574.  
  575. /* clos_lf1.c funzioni di sistema , di debug + funzioni varie OK*/
  576. void lf_gc LF_PARAMSD;
  577. void lf_exit LF_PARAMSD;
  578. void lf_stacktrace LF_PARAMSD;
  579. void lf_trace LF_PARAMSD;
  580. void lf_untrace LF_PARAMSD;
  581. void lf_gettime LF_PARAMSD;
  582. void lf_oblist LF_PARAMSD;
  583. void lf_fixlist LF_PARAMSD;
  584. void lf_getlenv LF_PARAMSD;
  585. void lf_getgenv LF_PARAMSD;
  586. void lf_hashstat LF_PARAMSD;
  587. void lf_break LF_PARAMSD;
  588. void lf_continue LF_PARAMSD;
  589. void lf_dribble LF_PARAMSD;
  590.  
  591. void lf_apply LF_PARAMSD;
  592. void lf_funcall LF_PARAMSD;
  593. void lf_mapcar LF_PARAMSD;
  594. void lf_assoc LF_PARAMSD;
  595. void lf_push LF_PARAMSD;
  596. void lf_pop LF_PARAMSD;
  597.  
  598. /* clos_lf2.c funzioni principali OK*/
  599. void lf_car LF_PARAMSD;
  600. void lf_cdr LF_PARAMSD;
  601. void lf_cons LF_PARAMSD;
  602. void lf_quote LF_PARAMSD;
  603. void lf_eval LF_PARAMSD;
  604. void lf_cond LF_PARAMSD;
  605. void lf_setf LF_PARAMSD;
  606. void lf_set LF_PARAMSD;
  607. void lf_append LF_PARAMSD;
  608. void lf_nconc LF_PARAMSD;
  609. void lf_list LF_PARAMSD;
  610. void lf_last LF_PARAMSD;
  611. void lf_elt LF_PARAMSD;
  612. void lf_reverse LF_PARAMSD;
  613. void lf_lenght LF_PARAMSD;
  614. void lf_function LF_PARAMSD;
  615. void lf_plist LF_PARAMSD;
  616. void lf_defvar LF_PARAMSD;
  617. void lf_defun LF_PARAMSD;
  618. void lf_defmacro LF_PARAMSD;
  619. void lf_backquote LF_PARAMSD;
  620. void lf_name2str LF_PARAMSD;
  621.  
  622. /* clos_lf3 matematiche OK*/
  623. void lf_sin LF_PARAMSD;
  624. void lf_cos LF_PARAMSD;
  625. void lf_tan LF_PARAMSD;
  626. void lf_asin LF_PARAMSD;
  627. void lf_acos LF_PARAMSD;
  628. void lf_atan LF_PARAMSD;
  629. void lf_sinh LF_PARAMSD;
  630. void lf_cosh LF_PARAMSD;
  631. void lf_tanh LF_PARAMSD;
  632. void lf_exp LF_PARAMSD;
  633. void lf_log LF_PARAMSD;
  634. void lf_log10 LF_PARAMSD;
  635. void lf_sqrt LF_PARAMSD;
  636. void lf_plus LF_PARAMSD;
  637. void lf_minus LF_PARAMSD;
  638. void lf_mult LF_PARAMSD;
  639. void lf_plusone LF_PARAMSD;
  640. void lf_minusone LF_PARAMSD;
  641. void lf_div LF_PARAMSD;
  642. void lf_max LF_PARAMSD;
  643. void lf_min LF_PARAMSD;
  644. void lf_abs LF_PARAMSD;
  645. void lf_rem LF_PARAMSD;
  646. void lf_float LF_PARAMSD;
  647. void lf_round LF_PARAMSD;
  648.  
  649. /* clos_lf4.c  manipolazione stringhe OK*/
  650. void lf_str2name LF_PARAMSD;
  651. void lf_str2real LF_PARAMSD;
  652. void lf_str2int LF_PARAMSD;
  653. void lf_str2ascii LF_PARAMSD;
  654. void lf_strnum LF_PARAMSD;
  655. void lf_strlen LF_PARAMSD;
  656. void lf_strcat LF_PARAMSD;
  657. void lf_strsub LF_PARAMSD;
  658. void lf_stringeq LF_PARAMSD;
  659. void lf_stringequal LF_PARAMSD;
  660. void lf_stringp LF_PARAMSD;
  661. void lf_strprintf LF_PARAMSD;
  662.  
  663. /* clos_lf5.c  predicati e funzioni logiche OK*/
  664. void lf_less LF_PARAMSD;
  665. void lf_great LF_PARAMSD;
  666. void lf_not LF_PARAMSD;
  667. void lf_atom LF_PARAMSD;
  668. void lf_and LF_PARAMSD;
  669. void lf_or LF_PARAMSD;
  670. void lf_eq LF_PARAMSD;
  671. void lf_endp LF_PARAMSD;
  672. void lf_symbolp LF_PARAMSD;
  673. void lf_numberp LF_PARAMSD;
  674. void lf_consp LF_PARAMSD;
  675. void lf_listp LF_PARAMSD;
  676. void lf_iszero LF_PARAMSD;
  677. void lf_s_less LF_PARAMSD;
  678. void lf_minusp LF_PARAMSD;
  679. void lf_plusp LF_PARAMSD;
  680. void lf_oddp LF_PARAMSD;
  681. void lf_evenp LF_PARAMSD;
  682. void lf_numequal LF_PARAMSD;
  683. void lf_functionp LF_PARAMSD;
  684. void lf_equal LF_PARAMSD;
  685. void lf_intp LF_PARAMSD;
  686. void lf_realp LF_PARAMSD;
  687. void lf_ratiop LF_PARAMSD;
  688. void lf_cnamep LF_PARAMSD;
  689. void lf_enamep LF_PARAMSD;
  690. void lf_classp LF_PARAMSD;
  691. void lf_sysfuncp LF_PARAMSD;
  692. void lf_macrop LF_PARAMSD;
  693. void lf_ufuncp LF_PARAMSD;
  694. void lf_valuep LF_PARAMSD;
  695. void lf_accessorp LF_PARAMSD;
  696. void lf_methodp LF_PARAMSD;
  697. void lf_streamp LF_PARAMSD;
  698. void lf_if LF_PARAMSD;
  699. void lf_when LF_PARAMSD;
  700. void lf_unless LF_PARAMSD;
  701.  
  702. /* cls_lf6.c iteratori e modificatori di environment OK*/
  703. void lf_return LF_PARAMSD;
  704. void lf_loop LF_PARAMSD;
  705. void lf_prog1 LF_PARAMSD;
  706. void lf_progn LF_PARAMSD;
  707. void lf_while LF_PARAMSD;
  708. void lf_dotimes LF_PARAMSD;
  709. void lf_dolist LF_PARAMSD;
  710. void lf_let LF_PARAMSD;
  711. void lf_letspecial LF_PARAMSD;
  712. void lf_do LF_PARAMSD;
  713. void lf_dospecial LF_PARAMSD;
  714. void lf_prog LF_PARAMSD;
  715. void lf_go LF_PARAMSD;
  716.  
  717. /* clos_lf7.c */
  718. void    lf_lambda LF_PARAMSD;
  719.  
  720. /* clos_lf8.c */
  721. void lf_graphpan LF_PARAMSD;
  722. void lf_graphrot LF_PARAMSD;
  723. void lf_graphzoom LF_PARAMSD;
  724. void lf_rot3d LF_PARAMSD;
  725. void lf_add3d LF_PARAMSD;
  726. void lf_mul3d LF_PARAMSD;
  727. void lf_sub3d LF_PARAMSD;
  728. void lf_div3d LF_PARAMSD;
  729.  
  730. /* lisp_lf9.c File e Console I/O OK*/
  731. void lf_fopen LF_PARAMSD;
  732. void lf_fclose LF_PARAMSD;
  733. void lf_fseek LF_PARAMSD;
  734. void lf_ftell LF_PARAMSD;
  735.  
  736. void lf_feof LF_PARAMSD;
  737. void lf_ferror LF_PARAMSD;
  738. void lf_fclearerr LF_PARAMSD;
  739.  
  740. void lf_freadbyte LF_PARAMSD;
  741. void lf_fwritebyte LF_PARAMSD;
  742. void lf_fprint LF_PARAMSD;
  743. void lf_finput LF_PARAMSD;
  744. void lf_fscanf LF_PARAMSD;
  745.  
  746. void lf_print LF_PARAMSD;
  747. void lf_input LF_PARAMSD;
  748. void lf_load LF_PARAMSD;
  749.  
  750. void lf_readline LF_PARAMSD;
  751. void lf_readchar LF_PARAMSD;
  752. void lf_curpos LF_PARAMSD;
  753. void lf_textcolor LF_PARAMSD;
  754. void lf_cls LF_PARAMSD;
  755.  
  756.  
  757. /* clos_lfg funzioni grafiche */
  758. void lf_graphopen LF_PARAMSD;
  759. void lf_graphclear LF_PARAMSD;
  760. void lf_gpencolor LF_PARAMSD;
  761. void lf_gpentick LF_PARAMSD;
  762. void lf_gpentype LF_PARAMSD;
  763. void lf_gbrushcolor LF_PARAMSD;
  764. void lf_gbrushtype LF_PARAMSD;
  765. void lf_gputpixel LF_PARAMSD;
  766. void lf_ggetpixel LF_PARAMSD;
  767. void lf_gmoveto LF_PARAMSD;
  768. void lf_glineto LF_PARAMSD;
  769. void lf_gfillpoly LF_PARAMSD;
  770. void lf_gfillellipse LF_PARAMSD;
  771. void lf_gfillsector LF_PARAMSD;
  772. void lf_gouttext LF_PARAMSD;
  773.  
  774. /* clos_cl1.c */
  775. void lf_defclass LF_PARAMSD;
  776.  
  777. /* clos_cl2.c */
  778. void lf_defmethod LF_PARAMSD;
  779. void lf_mkinstance LF_PARAMSD;
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.